package com.sdb.drug.service.impl;

import java.util.List;

import com.sdb.prescription.domain.TdPrescription;
import com.sdb.prescription.mapper.TdPrescriptionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sdb.drug.mapper.TdDrugMapper;
import com.sdb.drug.domain.TdDrug;
import com.sdb.drug.service.ITdDrugService;

/**
 * 药品库存Service业务层处理
 * 
 * @author yyh
 * @date 2025-02-05
 */
@Service
public class TdDrugServiceImpl implements ITdDrugService 
{
    @Autowired
    private TdDrugMapper tdDrugMapper;

    @Autowired
    private TdPrescriptionMapper tdPrescriptionMapper;

    /**
     * 查询药品库存
     * 
     * @param code 药品库存主键
     * @return 药品库存
     */
    @Override
    public TdDrug selectTdDrugByCode(Long code)
    {
        return tdDrugMapper.selectTdDrugByCode(code);
    }

    /**
     * 查询药品库存列表
     * 
     * @param tdDrug 药品库存
     * @return 药品库存
     */
    @Override
    public List<TdDrug> selectTdDrugList(TdDrug tdDrug)
    {
        return tdDrugMapper.selectTdDrugList(tdDrug);
    }

    /**
     * 查询预警药品库存数量
     *
     * @param tdDrug 药品库存
     * @return 药品库存数量
     */
    @Override
    public List<TdDrug> selectListWarn(TdDrug tdDrug)
    {
        return tdDrugMapper.selectTdDrugWarningList(tdDrug);
    }

    /**
     * 新增药品库存
     * 
     * @param tdDrug 药品库存
     * @return 结果
     */
    @Override
    public int insertTdDrug(TdDrug tdDrug)
    {
        return tdDrugMapper.insertTdDrug(tdDrug);
    }

    /**
     * 修改药品库存
     * 
     * @param tdDrug 药品库存
     * @return 结果
     */
    @Override
    public int updateTdDrug(TdDrug tdDrug)
    {
        return tdDrugMapper.updateTdDrug(tdDrug);
    }

    /**
     * 批量删除药品库存
     * 
     * @param codes 需要删除的药品库存主键
     * @return 结果
     */
    @Override
    public int deleteTdDrugByCodes(Long[] codes)
    {
        return tdDrugMapper.deleteTdDrugByCodes(codes);
    }

    /**
     * 删除药品库存信息
     * 
     * @param code 药品库存主键
     * @return 结果
     */
    @Override
    public int deleteTdDrugByCode(Long code)
    {
        return tdDrugMapper.deleteTdDrugByCode(code);
    }

    /**
     * 药品入库
     *
     * @param tdDrug 药品库存
     * @return 结果
     */
    @Override
    public int inStock(TdDrug tdDrug) {
        return tdDrugMapper.inStock(tdDrug);
    }

    /**
     * 药品出库
     *
     * @param tdDrug 药品库存
     * @return 结果
     */
    @Override
    public int outStock(TdDrug tdDrug) {
        return tdDrugMapper.outStock(tdDrug);
    }

    /**
     * 根据关键字查询药品库存
     *
     * @keyword
     * @return 结果
     */
    @Override
    public List<TdDrug> selectListByKey(String keyword) {
        return tdDrugMapper.selectTdDrugByKeyword(keyword);
    }

    @Override
    public int dispenseMedicines(List<TdDrug> tdDrugs) {
        // 遍历药品列表，检查库存是否满足发药数量
        for (TdDrug tdDrug : tdDrugs) {
            // 获取当前药品的库存数量
            Long currentStock = tdDrugMapper.getStock(tdDrug.getCode());
            // 获取发药数量
            Long dispenseQuantity = tdDrug.getCount();

            // 判断库存是否满足发药数量
            if (currentStock < dispenseQuantity) {
                // 如果库存不足，返回提示信息
                throw new RuntimeException("库存不足，请先补药。药品名称：" + tdDrug.getName() + "，库存：" + currentStock + "，发药数量：" + dispenseQuantity);
            }
        }

        //更新发药状态
        tdPrescriptionMapper.updateDispenseStatus(tdDrugs);

        // 如果所有药品库存都满足发药数量，则调用发药方法
        return tdDrugMapper.dispenseMedicines(tdDrugs);
    }
}
